﻿using System;

/// <summary>
///抽象工厂模式的主要角色如下。 
///抽象工厂（Abstract Factory）：提供了创建产品的接口，它包含多个创建产品的方法 newProduct()，可以创建多个不同等级的产品。
///具体工厂（Concrete Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创建。
///抽象产品（Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多个抽象产品。
///具体产品（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，它 同具体工厂之间是多对一的关系。
/// </summary>
namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            AbstractFactory abstractFactory = new ConcreteFactory1();
            var Product = abstractFactory.newProduct1();
            var Product1 = abstractFactory.newProduct2();
            Product.show();
        }
    }


    //抽象产品：提供了产品的接口
    interface Product1
    {
        public void show();
    }
    //具体产品1：实现抽象产品中的抽象方法
    class ConcreteProduct11 : Product1
    {
        public void show()
        {
            Console.WriteLine("具体产品11显示...");
        }
    }
    //具体产品2：实现抽象产品中的抽象方法
    class ConcreteProduct12 : Product1
    {
        public void show()
        {
            Console.WriteLine("具体产品12显示...");
        }
    }

    //抽象产品：提供了产品的接口
    interface Product2
    {
        public void show();
    }
    //具体产品1：实现抽象产品中的抽象方法
    class ConcreteProduct21 : Product2
    {
        public void show()
        {
            Console.WriteLine("具体产品21显示...");
        }
    }
    //具体产品2：实现抽象产品中的抽象方法
    class ConcreteProduct22 : Product2
    {
        public void show()
        {
            Console.WriteLine("具体产品22显示...");
        }
    }
    //抽象工厂：提供了厂品的生成方法
    interface AbstractFactory
    {
        public Product1 newProduct1();
        public Product2 newProduct2();
    }
    //具体工厂1：实现了厂品的生成方法
    class ConcreteFactory1 : AbstractFactory
    {

        public Product1 newProduct1()
        {
            Console.WriteLine("具体工厂1生成-->具体产品11...");
            return new ConcreteProduct11();
        }

        public Product2 newProduct2()
        {
            Console.WriteLine("具体工厂1生成-->具体产品21...");
            return new ConcreteProduct21();
        }
    }
    ////具体工厂2：实现了厂品的生成方法
    //class ConcreteFactory2 : AbstractFactory
    //{
    //    public Product newProduct()
    //    {
    //        Console.WriteLine("具体工厂2生成-->具体产品2...");
    //        return new ConcreteProduct2();
    //    }
    //}
}
